#include "Dri_I2C.h"

/**
 * @brief 开始位,准备发送数据
 *
 */
void Dri_I2c_Start()
{
    // 默认两个引脚都拉高
    SCL = 1;
    SDA = 1;

    // SDA拉低
    SDA = 0;
    // 将时钟信号拉低,为后面的信号做准备,自己擦自己的屁股
    SCL = 0;
}

/**
 * @brief 发送数据
 *
 * @param byte 1这个字节\
 */
void Dri_I2c_SendByte(u8 byte)
{
    u8 i;
    u8 data_res = 0X80;
    // 发送一个数据后,将时钟型号拉高,读取,然后在拉低
    for (i = 0; i < 8; i++) {
        // data_res = 0X80;
        if (i != 0) {
            data_res >>= 1;
        }

        SDA = (byte & data_res) == 0 ? 0 : 1;
        SCL = 1;
        SCL = 0;
    }
}

/**
 * @brief 接收数据
 *
 * @return u8 接收一个字节
 */
u8 Dri_I2c_Receive_Byte()
{
    u8 i;
    // 初始化 = 0
    u8 data_req = 0X00;
    SDA         = 1;

    for (i = 0; i < 8; i++) {
        // 时钟信号拉高
        SCL = 1;
        data_req <<= 1;
        data_req |= SDA;
        // 时钟信号拉低结束
        SCL = 0;
    }

    return data_req;
}

/**
 * @brief 主机接收应答数据
 *
 * @return bit
 */
bit Dri_I2c_Receive_Ask()
{
    bit ask;
    // 释放SDA总线，主设备与总线断开连接， 好让从设备能够向总线上发送数据
    SDA = 1;
    // 拉高时钟信号
    SCL = 1;
    // 获取应答数据
    ask = SDA;
    // 自己擦屁股
    SCL = 0;
    return ask;
}

/**
 * @brief 主机发送应答数据
 *
 * @param ask ask = 0(成功), ask = 1(失败)
 */
void Dri_I2c_Send_Ask(bit ask)
{
    SDA = ask;
    SCL = 1;
    SCL = 0;
}

/**
 * @brief 结束位,结束接收数据
 *
 */
void Dri_I2c_Stop()
{
    // 先将数据信号拉低,这样可以确定信号
    SDA = 0;

    // 时钟信号拉高
    SCL = 1;
    // 数据信号拉高
    SDA = 1;
}
